package es.udc.acs.cajero;

import java.net.SocketTimeoutException;
import java.util.Formatter;


import es.udc.acs.cajero.utils.GestorProperties;
import es.udc.acs.parser.ParserMensaje;
import es.udc.acs.udp.ClienteUDP;
import es.udc.acs.utils.CodigosFAP;
import es.udc.acs.utils.FormateadorDatos;

public class Cajero {
	
	private String idCajero;
	private String idConsorcio;
	private String serverConsorcio;
	private int portConsorcio;
	
	public Cajero(String id){
		
		idCajero = id;
		idConsorcio = 
				GestorProperties.devolverPropiedad(GestorProperties.IDCONSORCIO);		
		String pconsorcio = 
				GestorProperties.devolverPropiedad(GestorProperties.PUERTOCONSORCIO);
		
		serverConsorcio = ParserMensaje.obtenerServer(pconsorcio);
		portConsorcio   = Integer.parseInt(ParserMensaje.obtenerPuerto(pconsorcio));
	}
	
	
	public String consultaSaldo(String tarjeta, String cuenta){
		String message = idCajero + idConsorcio 
				+ CodigosFAP.CM_C_PD_CONSULTAR_SALDO + tarjeta + cuenta;
		
		GestorProperties.tratarMensaje(
				idCajero, "Cajero:mensaje enviado: ", message);

		FormateadorDatos.mostrarConsultaSaldo(message, false, true);
		
		try {
			return ClienteUDP.sendMessage(
					serverConsorcio, portConsorcio, message,90);
		} catch (SocketTimeoutException e) {
			GestorProperties.tratarMensaje(
					idCajero, "Cajero:consorcio no disponible: ", message);
			return null;
		}
	}
	
	
	public String consultaMovimientos(String tarjeta, String cuenta){
		String message = idCajero + idConsorcio + CodigosFAP.CM_C_PD_CONSULTAR_MOVIMIENTOS
				+ tarjeta + cuenta;
		
		GestorProperties.tratarMensaje(
				idCajero, "Cajero:mensaje enviado: ",message);

		FormateadorDatos.mostrarConsultaMovimientos(message, false, true);
		
		try {
			return ClienteUDP.sendMessage(
					serverConsorcio, portConsorcio, message,90);
		} catch (SocketTimeoutException e) {
			GestorProperties.tratarMensaje(
					idCajero, "Cajero:consorcio no disponible: ", message);
			return null;
		}
	}
	
	
	public String solicitudReintegro(String tarjeta, String cuenta, int importe){
			
   		String message = idCajero + idConsorcio + CodigosFAP.CM_C_PD_REINTEGRO
				+ tarjeta + cuenta + formatearImporte(importe);
   		
		GestorProperties.tratarMensaje(
				idCajero, "Cajero:mensaje enviado: ",message);

   		FormateadorDatos.mostrarReintegro(message, false, true);
   		
		try {
			return ClienteUDP.sendMessage(
					serverConsorcio, portConsorcio, message,90);
		} catch (SocketTimeoutException e) {
			GestorProperties.tratarMensaje(
					idCajero, "Cajero:consorcio no disponible: ", message);
			return null;
		}	}
	
	
	public String solicitudAbono(String tarjeta, String cuenta, int importe){
		
   		String message = idCajero + idConsorcio + CodigosFAP.CM_C_PD_ABONO
				+ tarjeta + cuenta + formatearImporte(importe);
   		
		GestorProperties.tratarMensaje(
				idCajero,"Cajero:mensaje enviado: ", message);
   		
   		FormateadorDatos.mostrarAbono(message, false, true);
   		
		try {
			return ClienteUDP.sendMessage(
					serverConsorcio, portConsorcio, message,90);
		} catch (SocketTimeoutException e) {
			GestorProperties.tratarMensaje(
					idCajero, "Cajero:consorcio no disponible: ", message);
			return null;
		}
	}
	
	
	public String solicitudTraspaso(String tarjeta, 
			                        String cuentaO, 
			                        String cuentaD, 
			                        int importe){		
		
   		String message = idCajero + idConsorcio + CodigosFAP.CM_C_PD_TRASPASO
				+ tarjeta + cuentaO + cuentaD + formatearImporte(importe);   		

		GestorProperties.tratarMensaje(
				idCajero, "Cajero:mensaje enviado: ",message);
   		
   		FormateadorDatos.mostrarTraspaso(message, false, true);
   		
		try {
			return ClienteUDP.sendMessage(
					serverConsorcio, portConsorcio, message,90);
		} catch (SocketTimeoutException e) {
			GestorProperties.tratarMensaje(
					idCajero, "Cajero:consorcio no disponible: ", message);
			return null;
		}
	}
	
	
	private String formatearImporte(int importe) {
		
        Formatter fmt = new Formatter();
        fmt.format("%04d",importe);
        
        return fmt.toString();
	}
	
	public String getIdCajero() {
		return idCajero;
	}
}
